package org.Yiran.timetale_re.util.item;

import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.Style;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

import java.util.List;

/**
 * 物品提示工具类
 * <p>
 * 提供处理物品悬停文本的通用逻辑，支持基础描述和按Shift键显示详细信息的功能。
 * 通过统一的接口简化物品提示的添加过程。
 * </p>
 * 
 * @author Yiran
 * @version 1.0
 */
public class TooltipUtils {
    
    /**
     * 为物品添加基础描述
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param descriptionId 物品的描述ID，用于构建本地化键
     */
    @OnlyIn(Dist.CLIENT)
    public static void addBaseDescription(List<Component> tooltip, String descriptionId) {
        String baseKey = descriptionId + ".desc";
        if (I18n.exists(baseKey)) {
            // 基础描述使用青色
            tooltip.add(Component.translatable(baseKey));
        }
    }
    
    /**
     * 添加分隔行
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addSeparatorLine(List<Component> tooltip) {
        tooltip.add(Component.translatable("item.timetale_re.not"));
    }
    
    /**
     * 添加详细信息（当按下Shift键时显示）
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param descriptionId 物品的描述ID，用于构建本地化键
     */
    @OnlyIn(Dist.CLIENT)
    public static void addDetailedInfo(List<Component> tooltip, String descriptionId) {
        String detailKey = descriptionId + ".detail";
        if (I18n.exists(detailKey)) {
            // 详细信息使用淡灰色
            tooltip.add(Component.translatable(detailKey));
        }
    }
    
    /**
     * 添加Shift提示信息（当未按下Shift键时显示）
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addShiftPrompt(List<Component> tooltip) {
        // 按住 左SHIFT 查看更多信息 (中等灰色)
        tooltip.add(Component.translatable("item.timetale_re.shift_info"));
    }
    
    /**
     * 检查是否按下了Shift键
     *
     * @return 是否按下了Shift键
     */
    @OnlyIn(Dist.CLIENT)
    public static boolean isShiftPressed() {
        return Screen.hasShiftDown();
    }

    /**
     * 为储能物品添加基础描述
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param descriptionId 物品的描述ID，用于构建本地化键
     * @param tierNameKey 物品等级名称键
     */
    @OnlyIn(Dist.CLIENT)
    public static void addEnergyStorageLevel(List<Component> tooltip, String descriptionId, String tierNameKey) {
        // | 等级: %s (中等灰色 "|" 和青色 "等级:")
        tooltip.add(Component.translatable("item.timetale_re.energy_storage_item.tier", 
                Component.translatable(tierNameKey)));
    }

    /**
     * 为储能物品添加详细信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param descriptionId 物品的描述ID，用于构建本地化键
     * @param energyStored 当前存储的能量
     * @param capacity 最大容量
     */
    @OnlyIn(Dist.CLIENT)
    public static void addEnergyStorageInfo(List<Component> tooltip, String descriptionId, int energyStored, int capacity, int displayMaxReceive) {
        // | 电量: %s/%s FE (绿色电量信息)
        tooltip.add(Component.translatable("item.timetale_re.energy_storage_item.energy_info", 
                   formatEnergyValue(energyStored), formatEnergyValue(capacity)));
        
        // | 输入/输出: %s FE/t (蓝色输入/输出信息)
        tooltip.add(Component.translatable("item.timetale_re.energy_storage_item.input_rate", 
                formatEnergyValue(displayMaxReceive)));
    }

    /**
     * 格式化能量数值显示
     *
     * @param energy 能量数值
     * @return 格式化后的字符串
     */
    @OnlyIn(Dist.CLIENT)
    public static String formatEnergyValue(int energy) {
        // 检查是否为int最大值，如果是则显示为无限
        if (energy == Integer.MAX_VALUE) {
            return "∞";
        }
        
        if (energy < 1000) {
            return String.valueOf(energy);
        } else if (energy < 1000000) {
            float value = energy / 1000.0f;
            return formatValue(value, "K");
        } else if (energy < 1000000000) {
            float value = energy / 1000000.0f;
            return formatValue(value, "M");
        } else {
            float value = energy / 1000000000.0f;
            return formatValue(value, "B");
        }
    }
    
    /**
     * 格式化带单位的数值，去除不必要的小数位
     *
     * @param value 数值
     * @param unit 单位
     * @return 格式化后的字符串
     */
    @OnlyIn(Dist.CLIENT)
    private static String formatValue(float value, String unit) {
        // 如果是整数，不显示小数点
        if (value == (long) value) {
            return String.format("%d%s", (long) value, unit);
        }
        // 如果小数部分为0，不显示小数点
        else if (value * 10 == (long) (value * 10)) {
            return String.format("%.1f%s", value, unit);
        }
        // 否则显示两位小数
        else {
            return String.format("%.2f%s", value, unit);
        }
    }
    
    /**
     * 添加模块安装提示信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addModuleInstallPrompt(List<Component> tooltip) {
        // 按住 左SHIFT + 右键 安装模块 (中等灰色)
        tooltip.add(Component.translatable("item.timetale_re.screwdriver.shift_left_info"));
    }

    /**
     * 添加功能模块切换提示信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addFunctionModuleSwitchPrompt(List<Component> tooltip) {
        // 按住 左CTRL + 右键 切换功能模块 (中等灰色)
        tooltip.add(Component.translatable("item.timetale_re.screwdriver.ctrl_info"));
    }

    /**
     * 添加创造模式起子信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addCreativeScrewdriverInfo(List<Component> tooltip) {
        // 此起子无法添加或移除模块 (红色)
        tooltip.add(Component.translatable("item.timetale_re.screwdriver.creative_level_info"));
    }

    /**
     * 添加已安装模块标题
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addInstalledModulesTitle(List<Component> tooltip) {
        // | 已安装模块: (绿色)
        tooltip.add(Component.translatable("item.timetale_re.installed_modules"));
    }

    /**
     * 添加无模块安装提示
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     */
    @OnlyIn(Dist.CLIENT)
    public static void addNoModulesInstalled(List<Component> tooltip) {
        // 未安装任何模块 (红色)
        tooltip.add(Component.translatable("item.timetale_re.no_modules_installed"));
    }

    /**
     * 添加剩余槽位信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param remainingSlots 剩余槽位数
     * @param maxSlots 最大槽位数
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRemainingSlotsInfo(List<Component> tooltip, int remainingSlots, int maxSlots) {
        // | 剩余槽位: %s/%s (青色)
        tooltip.add(Component.translatable("item.timetale_re.screwdriver.slots", remainingSlots, maxSlots));
    }

    /**
     * 添加当前功能模块信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param moduleName 模块名称
     */
    @OnlyIn(Dist.CLIENT)
    public static void addActiveFunctionModule(List<Component> tooltip, Component moduleName) {
        // | 当前功能模块: %s (中等灰色)
        tooltip.add(Component.translatable("item.timetale_re.active_function_module", moduleName));
    }

    /**
     * 添加符文类型信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param categoryKey 分类键
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneType(List<Component> tooltip, String categoryKey) {
        if (I18n.exists(categoryKey)) {
            // 符文种类: %s (中度灰色的橙色)
            tooltip.add(Component.translatable("item.timetale_re.rune_type",
                    Component.translatable(categoryKey)));
        }
    }

    /**
     * 添加符文雕刻目标信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param targetNameKey 目标名称键
     */
    @OnlyIn(Dist.CLIENT)
    public static void addCarvingTargetInfo(List<Component> tooltip, String targetNameKey) {
        if (I18n.exists(targetNameKey)) {
            // 正在雕刻为: %s (中度灰色的橙色)
            tooltip.add(Component.translatable("item.timetale_re.being_carved_info",
                    Component.translatable(targetNameKey)));
        }
    }

    /**
     * 添加符文雕刻进度信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param progress 进度
     */
    @OnlyIn(Dist.CLIENT)
    public static void addCarvingProgress(List<Component> tooltip, double progress) {
        // 雕刻进度: %s%% (中度灰色的橙色)
        tooltip.add(Component.translatable("item.timetale_re.carving_progress",
                String.format("%.1f", progress)));
    }

    /**
     * 添加符文冷却时间信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param cooldownSeconds 冷却时间（秒）
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneCooldown(List<Component> tooltip, double cooldownSeconds) {
        // 使用冷却时间: %s秒 (青色)
        tooltip.add(Component.translatable("item.timetale_re.rune_cooldown", String.format("%.1f", cooldownSeconds)));
    }

    /**
     * 添加模块等级信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param tierNameKey 等级名称键
     */
    @OnlyIn(Dist.CLIENT)
    public static void addModuleLevel(List<Component> tooltip, String tierNameKey) {
        // | 等级: %s (中等灰色 "|" 和青色 "等级:")
        tooltip.add(Component.translatable("item.timetale_re.energy_storage_item.tier", 
                Component.translatable(tierNameKey)));
    }

    /**
     * 添加凿子等级信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param chiselLevel 凿子等级
     */
    @OnlyIn(Dist.CLIENT)
    public static void addChiselLevel(List<Component> tooltip, int chiselLevel) {
        // 等级: %s (中等灰色)
        tooltip.add(Component.translatable("item.timetale_re.screwdriver_module.level", chiselLevel));
    }

    /**
     * 添加魔法道具等级信息（使用希腊数字和中度灰色的橙色）
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param level 等级
     */
    @OnlyIn(Dist.CLIENT)
    public static void addArcaneLevel(List<Component> tooltip, int level) {
        // 奥术等级: %s (中度灰色的橙色)
        tooltip.add(Component.translatable("item.timetale_re.arcane_level", convertToGreekNumerals(level)));
    }
    
    /**
     * 将阿拉伯数字转换为希腊数字
     *
     * @param number 阿拉伯数字
     * @return 希腊数字表示
     */
    @OnlyIn(Dist.CLIENT)
    private static String convertToGreekNumerals(int number) {
        // 希腊数字映射表（支持1-10）
        String[] greekNumerals = {"0", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ"};
        
        if (number >= 0 && number <= 10) {
            return greekNumerals[number];
        } else {
            // 超出范围的数字保持原样
            return String.valueOf(number);
        }
    }
    
    /**
     * 添加符文基础描述
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param runeType 符文类型
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneBaseDescription(List<Component> tooltip, String runeType) {
        String baseKey = "item.timetale_re." + runeType + "_rune.desc";
        if (I18n.exists(baseKey)) {
            tooltip.add(Component.translatable(baseKey));
        }
    }
    
    /**
     * 添加符文类型和等级信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param runeCategory 符文分类
     * @param runeLevel 符文等级
     * @param isBlankRune 是否为空白符文
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneTypeInfo(List<Component> tooltip, String runeCategory, int runeLevel, boolean isBlankRune) {
        // 显示符文种类（空白符文不显示）
        if (!isBlankRune) {
            String categoryKey = "item.timetale_re.rune_type." + runeCategory;
            addRuneType(tooltip, categoryKey);
        }

        // 显示符文等级
        if (!isBlankRune) {
            addArcaneLevel(tooltip, runeLevel);
        }
    }
    
    /**
     * 添加符文雕刻信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param targetType 目标类型
     * @param progress 雕刻进度
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneCarvingInfo(List<Component> tooltip, String targetType, double progress) {
        // 显示目标符文类型
        String targetRuneNameKey = "item.timetale_re." + targetType + "_rune";
        addCarvingTargetInfo(tooltip, targetRuneNameKey);
        // 显示雕刻进度
        addCarvingProgress(tooltip, progress);
    }
    
    /**
     * 添加符文冷却信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param cooldownSeconds 冷却时间（秒）
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneCooldownInfo(List<Component> tooltip, double cooldownSeconds) {
        addRuneCooldown(tooltip, cooldownSeconds);
    }
    
    /**
     * 添加符文图纸基础描述
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param runeType 符文类型
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneBlueprintBaseDescription(List<Component> tooltip, String runeType) {
        String baseKey = "item.timetale_re." + runeType + "_rune_blueprint.desc";
        if (I18n.exists(baseKey)) {
            tooltip.add(Component.translatable(baseKey));
        }
    }
    
    /**
     * 添加符文图纸详细信息
     *
     * @param tooltip 提示组件列表，用于添加提示信息
     * @param runeType 符文类型
     */
    @OnlyIn(Dist.CLIENT)
    public static void addRuneBlueprintDetailedInfo(List<Component> tooltip, String runeType) {
        String detailKey = "item.timetale_re." + runeType + "_rune_blueprint.detail";
        if (I18n.exists(detailKey)) {
            tooltip.add(Component.translatable(detailKey));
        }
    }
}